﻿using System.Diagnostics;

namespace 战斗系统原型
{
    internal static class 显示
    {
        public enum 日志类型
        {
            信息,
            重要,
            警告,
            错误,
            中断
        }

        public static void 日志输出(日志类型 类型, string 日志文本, int 中断代码 = 400)
        {
            StackTrace trace = new StackTrace();
            if (类型 == 日志类型.中断)
            {
                //获取是哪个类来调用的
                var 调用类名 = trace.GetFrame(1)!.GetMethod()!.DeclaringType!.ToString();
                //获取是类中的那个方法调用的
                string 调用方法 = trace.GetFrame(1)!.GetMethod()!.ToString()!;
                更换控制台颜色(ConsoleColor.Red);
                Console.WriteLine($"[{DateTime.Now} {类型.ToString()}] - 在 <{调用类名}> 类中的 <{调用方法}> 方法发生错误：{日志文本}");
                Console.ReadLine();
                更换控制台颜色(ConsoleColor.White);
                清空本行();
                Environment.Exit(中断代码);
                return;
            }
            if (类型 == 日志类型.警告 || 类型 == 日志类型.错误)
            {
                更换控制台颜色(ConsoleColor.Yellow);
                //获取是哪个类来调用的
                var 调用类名 = trace.GetFrame(1)!.GetMethod()!.DeclaringType!.ToString();
                //获取是类中的那个方法调用的
                string 调用方法 = trace.GetFrame(1)!.GetMethod()!.ToString()!;
                Console.WriteLine($"[{DateTime.Now} {类型.ToString()} - 在{调用类名}中的{调用方法}发生错误：{日志文本}");
                更换控制台颜色(ConsoleColor.White);
                return;
            }
            Console.WriteLine($"[{DateTime.Now} {类型.ToString()} ：{日志文本}");
            return;

        }

        public static void 更换控制台颜色(ConsoleColor 颜色)
        {
            Console.ForegroundColor = 颜色;
        }

        public static void 输出带颜色文本(int 行, int 列, string 文本, ConsoleColor 颜色)
        {
            Console.ForegroundColor = 颜色;
            Console.SetCursorPosition(列, 行);
            Console.Write(文本);
            Console.ForegroundColor = ConsoleColor.White;
        }

        public static void 输出带颜色文本行(int 行, int 列, string 文本, ConsoleColor 颜色)
        {
            Console.ForegroundColor = 颜色;
            Console.SetCursorPosition(列, 行);
            Console.WriteLine(文本);
            Console.ForegroundColor = ConsoleColor.White;
        }

        public static void 输出(int 行, int 列, string 文本)
        {
            Console.SetCursorPosition(列, 行);
            Console.Write(文本);
        }

        public static void 继续输出(string 文本)
        {
            Console.Write(文本);
        }

        public static void 输出行(int 行, string 文本)
        {
            Console.SetCursorPosition(0, 行);
            Console.WriteLine(文本);
        }
        public static void 输出行(string 文本)
        {
            Console.WriteLine(文本);
        }
        public static void 清空本行()
        {
            Console.SetCursorPosition(0, Console.CursorTop);
            Console.Write(new String(' ', Console.BufferWidth));
        }
        public static void 清空本换行()
        {
            Console.SetCursorPosition(0, Console.CursorTop - 1);
            Console.Write(new String(' ', Console.BufferWidth));
        }
        public static void 清空上一行()
        {
            Console.SetCursorPosition(0, Console.CursorTop - 2);
            Console.Write(new String(' ', Console.BufferWidth));
        }
        public static void 清空下一行()
        {
            Console.SetCursorPosition(0, Console.CursorTop + 1);
            Console.Write(new String(' ', Console.BufferWidth));
        }

        public static void 转到行(int 行号)
        {
            Console.SetCursorPosition(0, 行号);
        }

        public static void 清空屏幕()
        {
            Console.Clear();
        }

        public static (string 进度条, int 百分比) 新建进度条(int 进度条长度, char 前缀, char 后缀, char 空, char 满, float 当前值, float 最大值, bool 显示进度 = false)
        {
            int 满条数 = 0;
            if (当前值 != 0 || 最大值 != 0) { 满条数 = (int)(进度条长度 * (当前值 / 最大值)); }
            int 空条数 = 进度条长度 - 满条数;
            string 满区域 = "";
            for (int i = 0; i < 满条数; i++) { 满区域 += 满; }
            string 空区域 = "";
            for (int i = 0; i < 空条数; i++) { 空区域 += 空; }
            string 进度条 = $"{前缀}{满区域}{空区域}{后缀}";
            if (显示进度)
            {
                进度条 += $" {(int)Math.Round((float)当前值 / (float)最大值 * 100)}%";
            }
            return (进度条, (int)Math.Round((float)当前值 / (float)最大值 * 100));

        }

        public static void 光标设置(bool 启用)
        {
            Console.CursorVisible = 启用;
        }

    }
}
